<?
require_once(dirname(__FILE__)."/BAPElement.php");

class BAPTemplateField extends BAPElement {

	/** Llama a la funcion  general para crear el objeto */
	static public function &create(&$parser) {
		return parent::create("BAPTemplateField", &$parser);
	}	
	
	/** Devuelve el texto equivalente */
	/**
	function getValue() {
		$ret = "";
		if ($this->name != '') {
			$ret = "{$this->name} = ";
		}
		if ($this->value != '')
			$ret = "{$ret}{$this->value}";
			
		// Concatenamos los hijos
		foreach ($this->children as &$child) {
			$ret = "{$ret} ".$child->getValue();
		}
		$ret=$ret."\n";
		
		return $ret;
	}*/

	function __toString() {
		$ret = "";
		if ($this->name != '') {
			$ret = "{$this->name} = ";
		}
		if ($this->value != '')
			$ret = "{$ret}{$this->value}";
			
		// Concatenamos los hijos
		foreach ($this->children as &$child) {
			$ret = "{$ret} ".$child;
		}
		$ret=$ret."\n";
		
		return $ret;
	}
	
	/** La funcion principal de parseo del objeto */
	function parse() {
		/** Tiene las formas
			id = texto
			id = texto {{ template }} texto
			texto
			{{template}}
			**nada**
			
			Y luego puede haber }} o |, si luego hay fin de template u otro parametro
		*/
		
		$sym = $this->parser->currentSymbol();				
		$primeros = array(BasicArticleParser::SYM_TEXT,BasicArticleParser::SYM_DOBLE_OPEN,BasicArticleParser::SYM_PIPE);
		
		if (!in_array($sym['simbolo'],$primeros)) {
			/** ha fallado */
			return false;
		}

		if ($sym['simbolo']==BasicArticleParser::SYM_TEXT) {
			/** si es una cadena de texto, recogemos el identificador y continuamos 
				- si no lo fuera, los trataremos como nodos internos
			*/
			$valores = explode('=',$sym['cadena'],2);
			
			if (count($valores)==2) {
				// Si habia un =, lo ponemos como nombre y valor
				$this->name = trim($valores[0]);
				$this->value = trim($valores[1]);
			} else {
				// Si no habia igual, todo es valor
				$this->value = trim($valores[0]);
			}
			$sym = $this->parser->searchNextSymbol();
		}
		
		/** En realidad, al obtener el valor, tendremos que componer el objeto */
		
		while ($sym['simbolo']!=BasicArticleParser::SYM_END) {
			switch ($sym['simbolo']) {
				case BasicArticleParser::SYM_DOBLE_CLOSE:
				case BasicArticleParser::SYM_PIPE: 
					return true;
					break;
				case BasicArticleParser::SYM_DOBLE_OPEN:
					/** tenemos que reconocer el texto */
					$template = BAPTemplate::create(&$this->parser);
					if ($template == null) return false;
					array_push($this->children, $template);
					break;
				case BasicArticleParser::SYM_TEXT:
					/** llega el final del articulo, todo bien */
					$texto = BAPTemplateField::create(&$this->parser);
					if ($texto == null) return false;
					array_push($this->children, $texto);
					break;
				default:
					// TODO: esto esta mal ya que lo que deberia ocurrir es que cualquier cosa como | o {{{ o }}} deberian ser reconocidos como texto
					return false;					
			}
			$sym = $this->parser->currentSymbol();
		}
	}
}
?>